﻿using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using phones.Model;
using phones.Repository;
using System.Collections.ObjectModel;
using System.Windows.Input;
using System.Windows;
using GalaSoft.MvvmLight.Messaging;

namespace phones.ViewModel
{
    /// <summary>
    /// This class contains properties that the main View can data bind to.
    /// <para>
    /// Use the <strong>mvvminpc</strong> snippet to add bindable properties to this ViewModel.
    /// </para>
    /// <para>
    /// You can also use Blend to data bind with the tool's support.
    /// </para>
    /// <para>
    /// See http://www.galasoft.ch/mvvm
    /// </para>
    /// </summary>
    public class MainViewModel : ViewModelBase
    {
        private RelayCommand<object> _changeSelectedObject; // команда с параметром типа object
        private ServiceNodesRepository _nodeRepository;
        private RelayCommand _saveNodeAction;               // команда без параметра
        //private RelayCommand _addEmployeeCommand;
        private ServiceNode _selectedNode;
        private object _selectedObject;

        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            ////if (IsInDesignMode)
            ////{
            ////    // Code runs in Blend --> create design time data.
            ////}
            ////else
            ////{
            ////    // Code runs "for real"
            ////}
            InitializeRootNodes();
            AddEmployeeCommand = new RelayCommand(() => GoToAddEmployee());

        }

        private object GoToAddEmployee()
        {
            var msg = new GoToAddEmployeeMessage() { NameWindow = "AddEmployeeWindow" };
            Messenger.Default.Send<GoToAddEmployeeMessage>(msg);
            return null;

           
        }

      

        /// <summary>
        /// Команда для обработки события смены выделенного узла в дереве во View
        /// Изменяет свойство <i>SelectedObject</i> во ViewModel, к которому можно 
        /// привязывать детальное представление выделенного объекта
        /// </summary>
        public ICommand ChangeSelectedObject
        {
            get
            {
                if (_changeSelectedObject == null)
                    _changeSelectedObject = new RelayCommand<object>(SelectedNodeChangeAction);
                return _changeSelectedObject;
            }
        }

        public ICommand SaveNodeAction
        {
            get
            {
                if (_saveNodeAction == null) _saveNodeAction = new RelayCommand(SaveNode);
                return _saveNodeAction;
            }
        }

        //public ICommand AddEmployeeCommand
        //{
        //    get
        //    {
        //        if (_addEmployeeCommand == null) _addEmployeeCommand = new RelayCommand(AddEmployee);
        //        return _addEmployeeCommand;
        //    }
        //}

        public RelayCommand AddEmployeeCommand
        {
            get;
            private set;
        }

        public ServiceNode SelectedNode
        {
            get { return _selectedNode; }
            set
            {
                _selectedNode = value;
                OptionsStatic.ServiceNode = SelectedNode;
                RaisePropertyChanged("SelectedNode");
            }
        }

        public object SelectedObject
        {
            get { return _selectedObject; }
            set
            {
                _selectedObject = value;
                RaisePropertyChanged("SelectedObject");
            }
        }

        public ObservableCollection<ServiceNodeTreeItemViewModel> ServiceNodes { get; set; }

        private void InitializeRootNodes()
        {
            _nodeRepository = new ServiceNodesRepository();
            if (ServiceNodes == null) ServiceNodes = new ObservableCollection<ServiceNodeTreeItemViewModel>();
            foreach (ServiceNode i in _nodeRepository.GetList())
            {
                ServiceNodes.Add(new ServiceNodeTreeItemViewModel(i));
            }
        }

        //private void AddEmployee()
        //{
        //    System.Diagnostics.Debug.Print("тыц!");
        //    //AddEmployeeViewModel win = new AddEmployeeViewModel();
            
        //}

        private void SaveNode()
        {

        }

        private void SelectedNodeChangeAction(object param)
        {
            // в XAML коде мы указали PassEventArgsToCommand = true,
            // поэтому параметр будет равен аргументам события,
            // а значит нужно привести наш тип object к соответствующему типу
            var e = param as System.Windows.RoutedPropertyChangedEventArgs<object>;
            if (e == null)
            {
                // если не удалось преобразовать - сбрасываем выделенный объект
                SelectedObject = null;
            }
            else
            {
                // если все ОК - используем аргументы так же, как в событии
                var selectedNodeVM = e.NewValue;
                SetSelectedObject(selectedNodeVM);
            }
        }

        /// <summary>
        /// Метод пытается определить тип модели выделенного узла и 
        /// присвоить исходную модель свойству <i>SelectedObject</i>
        /// </summary>
        /// <param name="nodeVM">Модель узла, упакованная в тип object</param>
        private void SetSelectedObject(object nodeVM)
        {
            var serviceZoneNodeVM = nodeVM as ServiceNodeTreeItemViewModel;
            if (serviceZoneNodeVM != null)
            {
                SelectedObject = serviceZoneNodeVM.Model;
                return;
            }
            var organisationNodeVM = nodeVM as OrganisationNodeTreeItemViewModel;
            if (organisationNodeVM != null)
            {
                SelectedObject = organisationNodeVM.Model;
                return;
            }
            var departmentNodeVM = nodeVM as DepartnemtNodeTreeItemViewModel;
            if (departmentNodeVM != null)
            {
                SelectedObject = departmentNodeVM.Model;
                return;
            }
            var contactNodeVM = nodeVM as ContactTreeItemViewModel;
            if (contactNodeVM != null)
            {
                SelectedObject = contactNodeVM.Model;
                return;
            }
            SelectedObject = null;
        }
    }
}